#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=45;
const int M=220000;

int n;
LL m;
LL price[N];
LL ap[220000];
LL bp[220000];
int cnt;

void dfs(int l,int r,LL curw,LL* arr){
	if(curw>m) return;
	if(l>r){
		arr[cnt++]=curw;
		return;
	}
	dfs(l+1,r,curw,arr);
	dfs(l+1,r,curw+price[l],arr);
}

int main(){
	scanf("%d%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&price[i]);
	}
	int mid=(n+1)/2;
	cnt=0;
	dfs(1,mid,0,ap);
	int sizea=cnt;
	
	cnt=0;
	dfs(mid+1,n,0,bp);
	int sizeb=cnt;
	//
	sort(ap,ap+sizea);
	sort(bp,bp+sizeb);
//	for(int i=0;i<sizea;i++){
//		printf("%lld ",ap[i]);
//	}
//	printf("\n");
//	for(int i=0;i<sizeb;i++){
//		printf("%lld ",bp[i]);
//	}
//	printf("\n");
	LL ans=0;
	int l,r;
	for(int i=0;i<sizea;i++){
		LL w=ap[i];
		if(w+bp[sizeb-1]<=m){
			ans+=(LL)sizeb;
			continue;
		}
		l=0;r=sizeb-1;
		while(r-l>1){
			mid=(r-l)/2+l;
			if(bp[mid]+w<=m){
				l=mid;
			}
			else{
				r=mid-1;
			}
		}
		if(bp[r]+w<=m){
			l=r;
		}
		ans+=(LL)(l+1);
	}
	printf("%lld",ans);
	return 0;
}
